﻿#define  _CRT_SECURE_NO_WARNINGS 1


//实现srelen//const表示不修改main函数里的arr地址
#include <string.h>
#include <stdio.h>
#include <assert.h>
//size_t my_strlen(const char* str)//普通的算法，遇到‘\0’就停止 count++;
//{
//	size_t count = 0;
//	assert(str != NULL);
// 
//	while (*str)
//	{
//		count++;
//		str++;
//	}
//	return count;
//}

//size_t my_strlen2(const char* str)//指针减指针的算法:俩个指针相减的绝对值就是俩个指针之间的元素个数
//{
//	char* start = str;
//	assert(str != NULL);
//	while (*str)
//	{
//		str++;
//	}
//	return (size_t)(str - start);
//
//}

//size_t my_strlen3(const char* str)//使用递归方法
//{
//	assert(str != NULL);
//	if (*str == '\0')
//	{
//		return 0;
//	}
//	else
//	{
//		return 1 + my_strlen3(str + 1);
//	}
//}
//int main()
//{
//	char arr[] = "abcdef";
//
//	size_t ret = my_strlen(arr);
//	/*size_t ret = my_strlen2(arr);*/
//	//size_t ret = my_strlen3(arr);
//
//	printf("%zd", ret);
//
//	return 0;
//}

//strcpy的使用//strcpy的返回类型是char*//使用条件1.目标空间足够大2.且是可修改的空间（const修饰的不可修改会报错）3.因为'\0'也会被拷贝，所以原字符里必须有'\0'。
#include <stdio.h>
#include <string.h>
#include <assert.h>
//int main()
//{
//	char arr1[20] = "############";
//	char arr2[] = "abcd";
//	strcpy(arr1, arr2);
//
// for(int i = 0; i<20;i++)
// {
// 
// }
//	
//	return 0;
//}

//strcpy的模拟实现
//char* my_strcpy(char* arr1,const char* arr2)
//{
//		char* start = arr1;
//		assert(arr1 != NULL);
//		assert(arr2 != NULL);
//	//while(*arr2 != '\0')
//	//{
//	//	*arr1 = *arr2;
//	//	arr2++;
//	//	arr1++;
//	//}
//	//*arr1 = *arr2;
//
//	while (*arr1++ = *arr2++)
//		;
// 
// return arr1;
//
//}
//int main()
//{
//	char arr1[20] = "##########";
//	char arr2[] = "abcd";
//
//	my_strcpy(arr1, arr2);
//
//	printf("%s", arr1);
//
//	return 0;
//}


//strcat的使用//原理是找到目标（arr1）的\0 位置，然后从\0开始将arr2的字符从第一个开始直到遇到源字符串'\0'结束追加，注意‘\0’也会被追加进去
//使用条件1.目标空间足够大并且可修改（不能是常量字符串）,2.源字符串与目标字符窜必须有\0
//返回的是目标空间的首字符地址
//int main()
//{
//	char arr1[20] = "##########\0#######";
//	char arr2[] = "abcd";
//
//	strcat(arr1, arr2);
//	printf("%s", arr1);
//
//	return 0;
//}

//strcat的模拟实现
//char* my_strcat(char* arr1, const char* arr2)
//{
//	char* start = arr1;
//		assert(arr1 != NULL);
//		assert(arr2 != NULL);
//	/*while(*arr2 != '\0')
//	{
//		if (*arr1 != '\0')
//		{
//			arr1++;
//		}
//		else
//		{
//			*arr1 = *arr2;
//			*arr1++;
//			*arr2++;
//		}
//	}*/
//	while (*arr1)
//	{
//		arr1++;
//	}
//	while ((*arr1++ = *arr2++))
//		;
//	return start;
//}

//int main()
//{
//	char arr1[20] = "###########";
//	char arr2[] = "abcd";
//
//	my_strcat(arr1, arr2);
//
//	printf("%s", arr1);
//	return 0;
//}

//strcmp比较字符串大小的库函数//返回类型是int, arr1 > arr2 返回大于零，arr1 < arr2 返回小于零，arr1 == arr2 返回==零
//int main()
//{
//	char arr1[20] = "abcdef";
//	char arr2[] = "abc";
//	char arr3 = "bc";
//
//	if (strcmp(arr1, arr2) > 0 )
//	{
//		printf("arr1 大于 arr2\n");
//	}
//	else if (strcmp(arr1,arr2) < 0)
//	{
//		printf("arr1 小于 arr2\n");
//	}
//	else
//	{
//		printf("arr1 == arr2 \n");
//	}
//	
//
//	return 0;
//}

////模拟实现strcmp
//int my_strcmp(const char* arr1, const char* arr2)
//{
//	assert(*arr1);
//	assert(*arr2);
//
//	while(*arr1 == *arr2)
//	{
//		if (*arr2 == '\0')
//			return 0;
//		arr1++;
//		arr2++;
//	}
//	return *arr1 - *arr2;
//
//}
//
//int main()
//{
//	char arr1[20] = "abcdef";
//	char arr2[] = "abc";
//	char arr3[] = "bc";
//
//	int ret12 = my_strcmp(arr1, arr2);
//	int ret13 = my_strcmp(arr1, arr3);
//
//	if (ret12 > 0)	
//	{
//		printf("arr1 > arr2\n");
//	}
//	else if (ret12 < 0)
//	{
//		printf("arr1 < arr2\n");
//	}
//	else
//	{
//		printf("arr1 == arr2\n");
//	}
//		
//	if (ret13 > 0)
//	{
//		printf("arr1 > arr3\n");
//	}
//	else if (ret13 < 0)
//	{
//		printf("arr1 < arr3\n");
//	}
//	else
//	{
//		printf("arr1 == arr3\n");
//	}
//	return 0;
//}


//strstr的使用//找相同的字符串,函数返回字符串arr2在字符串arr1中第⼀次出现的位置
//#include <stdio.h>
//#include <string.h>
//int main()
//{
//	char str[] = "This is a simple string";
//	char* pch;
//	pch = strstr(str, "simple");
//	strncpy(pch, "sample", 6);
//	printf("%s\n", str);
//	return 0;
//}

//strstr的实现
//char* my_strstr(const char* str1, const char* str2)
//{
//	const char* cur = (char*)str1;
//	const char* s1 = NULL;
//	const char* s2 = NULL;
//
//	assert(str1 && str2);
//
//	if (*str1 == '\0')
//	{
//		return str1;
//	}
//	while (*cur)
//	{
//		s1 = (char*)cur;
//		s2 = (char*)str2;
//		while (*s1 == *s2)
//		{
//			s1++;
//			s2++;
//		}
//		if (*s2 == '\0')
//			return (char*)(cur);
//			cur++;
//	}
//}
//
//int main()
//{
//	char arr1[20] = "abbbcdef";
//	char arr2[] = "bbc";
//	char* ret = my_strstr(arr1, arr2);
//	if(ret)
//	{
//		printf("%s", ret);
//	}
//	else
//	{
//		printf("找不到\n");
//	}
//	return 0;
//}
// 
//#include  <stdio.h>
//int main()
//{
//    int a = 0;
//    double b = 0.0;
//    int c[3] = { 0 };
//
//    printf("a 的地址是:%p\n", &a);
//    printf("b 的地址是:%p\n", &b);
//    printf("c[0] 的地址是:%p\n", &c[0]);
//    printf("c[1] 的地址是:%p\n", &c[1]);
//    printf("c[2] 的地址是:%p\n", &c[2]);
//
//    return 0;
//}
//#include <stdio.h>
//
//int main()
//{
//	int hon = 20;//表示小红的年龄
//	int ming = 18;//表示小明的年龄
//	int tian = 34;//表示大田的年龄
//
//	int* lovewan = &hon;//表示爱小红
//	int* lovegui = &tian;//表示爱大田
//
//	printf("小王爱的人的年龄：%d\n", *lovewan);
//	printf("小贵爱的人的年龄：%d\n", *lovegui);
//
//	lovewan = &tian;	//移情别恋，表示小红喜欢田的年龄了
//
//	*lovegui = 40;     //将lovetian指向的对像赋值为40//修改了小贵的爱的人的年龄
//
//	putchar('\n');
//	printf("小红的年龄:%d\n", hon);
//	printf("小明的年龄:%d\n", ming);
//	printf("小田的年龄:%d\n", tian);
//	printf("小王爱的人的年龄:%d\n", *lovewan);
//	printf("小贵爱的人的年龄:%d\n", *lovegui);
//
//
//	return 0;
//}
